package xutil

import (
	"context"

	"gitee.com/wosylf/ltool/pkg/xhttp"
)

type S钉钉通知类型 string

const (
	钉钉群机器人地址         = "https://oapi.dingtalk.com/robot/send"
	V类型_文本   S钉钉通知类型 = "text"
)

var (
	ctx = context.Background()
)

type S钉钉链接 struct {
	Token string
}

func F新建钉钉通知链接(token string) *S钉钉链接 {
	return &S钉钉链接{
		Token: token,
	}
}

type DdMsg struct {
	Id        int64  `gorm:"primarykey"  json:"id" form:"id"`
	Msgtype   string `gorm:"type:varchar(16);comment:'消息类型'" json:"msgtype" form:"msgtype"`
	Body      string `gorm:"type:varchar(1280);comment:'消息的内容'" json:"body" form:"body"`
	AtMobiles string `gorm:"type:varchar(256);comment:'通知的人'"  json:"atMobiles" form:"atMobiles"`
	IsAtAll   int8   `gorm:"comment:'是否通知全部'"  json:"isAtAll" form:"isAtAll"`
}

// 发送的结构体
type CMsg struct {
	Msgtype S钉钉通知类型 `gorm:"-" json:"msgtype" form:"msgtype"`
	Token   string  `gorm:"-" json:"token" form:"token"`
	//Token   string `gorm:"-" json:"token,omitempty" form:"token"`
	Text DdText `gorm:"-" json:"text" form:"text"`
	DdAt DdAt   `gorm:"-" json:"at" form:"at"`
}

type ReqMsg struct {
	Errcode int    `gorm:"-" json:"errcode" form:"errcode"` //成功是0
	Errmsg  string `gorm:"-" json:"errmsg" form:"errmsg"`   //成功是ok
}

type DdText struct {
	Content string `gorm:"-" json:"content" form:"content"`
}

type DdAt struct {
	AtMobiles []string `gorm:"-"  json:"atMobiles" form:"atMobiles"`
	AtUserIds []string `gorm:"-"  json:"atUserIds" form:"atUserIds"`
	IsAtAll   bool     `gorm:"-"  json:"isAtAll" form:"isAtAll"`
}

// 默认文本，还有默认的accesstoken
func (a *S钉钉链接) F新建消息(是否通知全部 ...int) *CMsg {

	at := DdAt{
		IsAtAll: len(是否通知全部) == 1,
	}
	return &CMsg{Msgtype: V类型_文本, DdAt: at, Token: a.Token}
}

func (msg *CMsg) F添加接收人(str ...string) *CMsg {
	if len(str) == 0 {
		return msg
	}
	msg.DdAt.AtMobiles = append(msg.DdAt.AtMobiles, str...)
	return msg
}

func (msg *CMsg) F添加接收的消息(text string) *CMsg {
	msg.Text.Content = text
	return msg
}

func (msg *CMsg) F发送钉钉通知() (res *ReqMsg, err error) {
	res = new(ReqMsg)
	地址 := 钉钉群机器人地址 + "?access_token=" + msg.Token
	_, err = xhttp.NewClient().Type(xhttp.TypeJSON).Post(地址).SendStruct(msg).EndStruct(ctx, &res)
	return
}
